<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script>
// 父级构造函数，里面有父级的方法和属性
function Person(name){
	this.name = name;
	this.sum = function(){
		console.log(this.name)
	}
}
// 方式一：
// 给父级构造函数添加原型属性
Person.prototype.age = 10;

//子级构造函数
function Per(){
	this.name = 'one'
}
// 把子级Per构造函数的原型指（继承）到了Person的实例身上（new Person()）
Per.prototype = new Person() 
// 创建一个子级实例per
var per = new Per()
//per本身没有age这个属性，他会顺着原型链访问到继承过来的父级原型身上的age,所以打印10
console.log(per.age)

// 方式二：
// 子级构造函数
function Con(){
// 当前Con的this来借调Person的构造函数
	Person.call(this,'twe')
}
// 创建一个子级实例con1
var con = new Con();
// con本身没有name属性，但是借用了Person构造函数的属性，所以能够将twe赋值
console.log(con.name);//twe

// 方式三：
// 组合继承（组合原型链继承和借用构造函数继承）（常用）
//子级构造函数
// 父级构造函数，里面有父级的方法和属性
function SubType(name){
	// 当前SubType的this来借调Person的构造函数
	Person.call(this,name)
}
// 让SubType的原型指到Person的实例对象上
SubType.prototype = new Person();
// 创建一个子级实例sub,并且传值进去。赋值
var sub = new SubType('three');
console.log(sub.name)//three  sub本身没有name属性，但是借用了Person构造函数的属性，所以能够将three赋值
console.log(sub.age)//10  sub本身没有age属性,但是继承了Person的构函函数，以及他的原型，所以能够将10打出


	</script>
</body>
</html>